using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DFeatures._Conversion
{
    /// <summary>
    /// <para>Layer 3D To Feature Class</para>
    /// <para>Exports feature layers with 3D display properties to 3D lines or multipatch features.</para>
    /// <para>将具有 3D 显示属性的要素图层导出为 3D 线或多面体要素。</para>
    /// </summary>    
    [DisplayName("Layer 3D To Feature Class")]
    public class Layer3DToFeatureClass : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Layer3DToFeatureClass()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_feature_layer">
        /// <para>Input Feature Layer</para>
        /// <para>The input feature layer with 3D display properties defined.</para>
        /// <para>定义了 3D 显示属性的输入要素图层。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class with 3D features. Extruded points will be exported as 3D lines. Points with 3D symbols, extruded lines, and polygons will be exported as multipatch features.</para>
        /// <para>具有 3D 要素的输出要素类。拉伸点将导出为 3D 线。具有 3D 符号、拉伸线和面的点将输出为多面体要素。</para>
        /// </param>
        public Layer3DToFeatureClass(object _in_feature_layer, object _out_feature_class)
        {
            this._in_feature_layer = _in_feature_layer;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Layer 3D To Feature Class";

        public override string CallName => "3d.Layer3DToFeatureClass";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_feature_layer, _out_feature_class, _group_field, _disable_materials.GetGPValue()];

        /// <summary>
        /// <para>Input Feature Layer</para>
        /// <para>The input feature layer with 3D display properties defined.</para>
        /// <para>定义了 3D 显示属性的输入要素图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Feature Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_feature_layer { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class with 3D features. Extruded points will be exported as 3D lines. Points with 3D symbols, extruded lines, and polygons will be exported as multipatch features.</para>
        /// <para>具有 3D 要素的输出要素类。拉伸点将导出为 3D 线。具有 3D 符号、拉伸线和面的点将输出为多面体要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Grouping Field</para>
        /// <para>The input feature's text field that will be used to merge multiple input features into the same output feature. The resulting output's remaining attributes will be inherited from one of the input records.</para>
        /// <para>输入要素的文本字段，用于将多个输入要素合并到同一输出要素中。生成的输出的其余属性将从其中一个输入记录继承。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Grouping Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _group_field { get; set; } = null;


        /// <summary>
        /// <para>Disable Color and Texture</para>
        /// <para><xdoc>
        ///   <para>Specifies whether color and texture properties will be maintained when exporting a 3D layer to a multipatch feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Colors and textures will not be stored as part of the multipatch definition. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Colors and textures will be preserved with the multipatch.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定在将 3D 图层导出到多面体要素类时是否保留颜色和纹理属性。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 颜色和纹理不会存储为多面体定义的一部分。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 颜色和纹理将保留与多面体一起。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Disable Color and Texture")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _disable_materials_value _disable_materials { get; set; } = _disable_materials_value._false;

        public enum _disable_materials_value
        {
            /// <summary>
            /// <para>DISABLE_COLORS_AND_TEXTURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("DISABLE_COLORS_AND_TEXTURES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>ENABLE_COLORS_AND_TEXTURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ENABLE_COLORS_AND_TEXTURES")]
            [GPEnumValue("false")]
            _false,

        }

        public Layer3DToFeatureClass SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}